home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / PowerD_mui / examples / Slidorama.d < prev    next >
Encoding:
Text File  |  2002-03-13  |  10.9 KB  |  354 lines

  1. /*
  2. ** Demosource on how to use customclasses in D.
  3. ** Based on the C example 'Slidorama.c' by Stafan Stuntz.
  4. ** Translated to E by Sven Steiniger
  5. ** Translated to D by Martin <MarK> Kuchinka
  6. */
  7.  
  8. MODULE    'muimaster',
  9.             'libraries/mui',
  10.             'intuition/classes',
  11.             'intuition/classusr',
  12.             'intuition/screens',
  13.             'intuition/intuition',
  14.             'utility',
  15.             'utility/tagitem',
  16.             'lib/amiga'
  17.  
  18. CONST    MUIA_Mousepower_Direction=TAG_USER|$10001
  19.  
  20. OBJECT mousepowerdata
  21.     decrease:INT,
  22.     mousex:INT,
  23.     mousey:INT,
  24.     direction:INT
  25.  
  26. OBJECT ratingdata
  27.   buf[20]:CHAR
  28.  
  29. OBJECT timedata
  30.   buf[16]:CHAR
  31.  
  32. DEF    mousepowerclass=NIL:PTR TO MUI_CustomClass,
  33.         ratingclass=NIL:PTR TO MUI_CustomClass,
  34.         timebuttonclass=NIL:PTR TO MUI_CustomClass,
  35.         timesliderclass=NIL:PTR TO MUI_CustomClass
  36.  
  37.  
  38. /*****************************************************************************
  39. ** This is the Mousepower custom class, a sub class of Levelmeter.mui.
  40. ** It is quite simple and does nothing but add some input capabilities
  41. ** to its super class by implementing MUIM_HandleInput.
  42. ** Don't be afraid of writing sub classes!
  43. ******************************************************************************/
  44.  
  45. PROC MousePowerDispatcher(cl:PTR TO IClass IN a0,obj IN a2,msg:PTR TO Msg IN a1)(L)
  46.     DEF    data:PTR TO mousepowerdata,
  47.             m:PTR TO MUIP_HandleInput,
  48.             delta
  49.  
  50.     SELECT msg.MethodID
  51.     CASE OM_NEW
  52.         IF obj:=DoSuperMethodA(cl,obj,msg)
  53.             data:=INST_DATA(cl,obj)
  54.             data.mousex:=-1
  55.             data.direction:=GetTagData(MUIA_Mousepower_Direction,0,msg::OpSet.AttrList)
  56.             set(obj,MUIA_Numeric_Max,1000)
  57.         ENDIF
  58.         RETURN obj
  59.     CASE MUIM_Setup
  60.         data:=INST_DATA(cl,obj)
  61.         IFN DoSuperMethodA(cl,obj,msg) THEN RETURN FALSE
  62.         data.mousex:=-1
  63.         set(obj,MUIA_Numeric_Max,1000)
  64.         MUI_RequestIDCMP(obj,IDCMP_MOUSEMOVE|IDCMP_INTUITICKS|IDCMP_INACTIVEWINDOW)
  65.         RETURN MUI_TRUE
  66.     CASE MUIM_Cleanup
  67.         MUI_RejectIDCMP(obj,IDCMP_MOUSEMOVE|IDCMP_INTUITICKS|IDCMP_INACTIVEWINDOW)
  68.         RETURN DoSuperMethodA(cl,obj,msg)
  69.     CASE MUIM_HandleInput
  70.         m:=msg
  71.         data:=INST_DATA(cl,obj)
  72.         IF m.imsg
  73.             IF m.imsg.Class=IDCMP_MOUSEMOVE
  74.                 IF data.mousex<>-1
  75.                     IF data.direction=1
  76.                         delta:=Abs(data.mousex-m.imsg.MouseX)*2
  77.                     ELSEIF data.direction=2
  78.                         delta:=Abs(data.mousey-m.imsg.MouseY)*2
  79.                     ELSE
  80.                         delta:=Abs(data.mousex-m.imsg.MouseX)+Abs(data.mousey-m.imsg.MouseY)
  81.                     ENDIF
  82.                     IF data.decrease>0 THEN data.decrease:=data.decrease-1
  83.                     DoMethodA(obj,[MUIM_Numeric_Increase,delta/10])
  84.                 ENDIF
  85.                 data.mousex:=m.imsg.MouseX
  86.                 data.mousey:=m.imsg.MouseY
  87.             ELSEIF m.imsg.Class=IDCMP_INTUITICKS
  88.                 DoMethodA(obj,[MUIM_Numeric_Decrease,data.decrease*data.decrease])
  89.                 IF data.decrease<50 THEN data.decrease++
  90.             ELSEIF m.imsg.Class=IDCMP_INACTIVEWINDOW
  91.                 set(obj,MUIA_Numeric_Value,0)
  92.             ENDIF
  93.         ENDIF
  94.         RETURN 0
  95.     ENDSELECT
  96. ENDPROC DoSuperMethodA(cl,obj,msg)
  97.  
  98.  
  99. /*****************************************************************************
  100. ** This is the Rating custom class, a sub class of Slider.mui.
  101. ** It shows how to override the MUIM_Numeric_Stringify method
  102. ** to implement custom displays in a slider gadget. Nothing
  103. ** easier than that... :-)
  104. ******************************************************************************/
  105.  
  106. PROC RatingDispatcher(cl:PTR TO IClass IN a0,obj IN a2,msg:PTR TO Msg IN a1)(LONG)
  107.     DEF    data:PTR TO ratingdata,
  108.             m:PTR TO MUIP_Numeric_Stringify,
  109.             r,l:PTR TO LONG
  110.  
  111.     SELECT msg.MethodID
  112.     CASE MUIM_Numeric_Stringify
  113.         data:=INST_DATA(cl,obj)
  114.         m:=msg
  115.         IF m.value=0
  116.             StrCopy(data.buf,'You''re kidding!')
  117.         ELSEIF m.value=100
  118.             StrCopy(data.buf,'It''s magic!')
  119.         ELSE
  120.             l:=[':-((',':-(',':-|',':-)',':-))']:LONG
  121.             r:=DoMethodA(obj,[MUIM_Numeric_ValueToScale,0,4 /*5 States, 0..4*/])
  122.             StringF(data.buf,'\d[3] points. \s',m.value,l[r])
  123.         ENDIF
  124.         RETURN data.buf
  125.     ENDSELECT
  126. ENDPROC DoSuperMethodA(cl,obj,msg)
  127.  
  128.  
  129. /*****************************************************************************
  130. ** A time slider custom class. Just like with the Rating class, we override
  131. ** the MUIM_Numeric_Stringify method. Wow... our classes get smaller and 
  132. ** smaller. This one only has about 10 lines of C code. :-)
  133. ** Note that we can use this TimeDispatcher as subclass of any of
  134. ** MUI's numeric classes. In Slidorama, we create a Timebutton class
  135. ** from MUIC_Numericbutton and Timeslider class for MUIC_Slider with
  136. ** the same dispatcher function.
  137. ******************************************************************************/
  138.  
  139. PROC TimeDispatcher(cl:PTR TO IClass IN a0,obj IN a2,msg:PTR TO Msg IN a1)(LONG)
  140.     DEF    data:PTR TO timedata,
  141.             m:PTR TO MUIP_Numeric_Stringify
  142.  
  143.     SELECT msg.MethodID
  144.     CASE MUIM_Numeric_Stringify
  145.         data:=INST_DATA(cl,obj)
  146.         m:=msg
  147.         StringF(data.buf,'\z\d[2]:\z\d[2]',m.value/60,m.value\60)
  148.         RETURN data.buf
  149.     ENDSELECT
  150. ENDPROC DoSuperMethodA(cl,obj,msg)
  151.  
  152.  
  153. /*****************************************************************************
  154. ** Main Program
  155. ******************************************************************************/
  156.  
  157. PROC CleanupClasses()
  158.     IF mousepowerclass THEN MUI_DeleteCustomClass(mousepowerclass)
  159.     IF ratingclass     THEN MUI_DeleteCustomClass(ratingclass)
  160.     IF timebuttonclass THEN MUI_DeleteCustomClass(timebuttonclass)
  161.     IF timesliderclass THEN MUI_DeleteCustomClass(timesliderclass)
  162. ENDPROC
  163.  
  164. PROC CreateCustomClass(father,datasize,dispatcher)(PTR)
  165.     DEF mcc
  166.     mcc:=MUI_CreateCustomClass(NIL,father,NIL,datasize,dispatcher)
  167.     IF mcc=NIL THEN Raise('Could not create custom class.')
  168. ENDPROC mcc
  169.  
  170. PROC SetupClasses()
  171.   mousepowerclass:=CreateCustomClass(MUIC_Levelmeter,SIZEOF_mousepowerdata,&MousePowerDispatcher)
  172.   ratingclass    :=CreateCustomClass(MUIC_Slider,SIZEOF_ratingdata,&RatingDispatcher)
  173.   timesliderclass:=CreateCustomClass(MUIC_Slider,SIZEOF_timedata,&TimeDispatcher)
  174.   timebuttonclass:=CreateCustomClass(MUIC_Numericbutton,SIZEOF_timedata,&TimeDispatcher)
  175. ENDPROC
  176.  
  177. DEF    MUIMasterBase,UtilityBase
  178.  
  179. PROC main()
  180.     DEF    app=NIL,window,sigs=0
  181.  
  182.     IFN MUIMasterBase:=OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN) THEN
  183.         Raise('Failed TO open muimaster.library')
  184.  
  185.     IFN UtilityBase:=OpenLibrary('utility.library',0) THEN
  186.         Raise('Failed TO open utility.library')
  187.  
  188.     SetupClasses()
  189.  
  190.     app := ApplicationObject,
  191.         MUIA_Application_Title      , 'Slidorama',
  192.         MUIA_Application_Version    , '$VER: Slidorama 12.10 (21.11.95)',
  193.         MUIA_Application_Copyright  , '©1992-95, Stefan Stuntz',
  194.         MUIA_Application_Author     , 'Stefan Stuntz',
  195.         MUIA_Application_Description, 'Show different kinds OF sliders',
  196.         MUIA_Application_Base       , 'SLIDORAMA',
  197.  
  198.         SubWindow, window := WindowObject,
  199.             MUIA_Window_Title, 'Slidorama',
  200.             MUIA_Window_ID   , "SLID",
  201.  
  202.             WindowContents, VGroup,
  203.  
  204.                 Child, HGroup,
  205.  
  206.                     Child, VGroup, GroupSpacing(0), GroupFrameT('Knobs'),
  207.                         Child, VSpace(0),
  208.                         Child, ColGroup(6),
  209.                             GroupSpacing(0),
  210.                             Child, VSpace(0),
  211.                             Child, HSpace(4),
  212.                             Child, CLabel('1'),
  213.                             Child, CLabel('2'),
  214.                             Child, CLabel('3'),
  215.                             Child, CLabel('4'),
  216.                             Child, VSpace(2),
  217.                             Child, VSpace(2),
  218.                             Child, VSpace(2),
  219.                             Child, VSpace(2),
  220.                             Child, VSpace(2),
  221.                             Child, VSpace(2),
  222.                             Child, Label('Volume:'),
  223.                             Child, HSpace(4),
  224.                             Child, NewKnobObject1(64,64),
  225.                             Child, NewKnobObject1(64,64),
  226.                             Child, NewKnobObject1(64,64),
  227.                             Child, NewKnobObject1(64,64),
  228.                             Child, Label('Bass:'),
  229.                             Child, HSpace(4),
  230.                             Child, NewKnobObject2(-100,100),
  231.                             Child, NewKnobObject2(-100,100),
  232.                             Child, NewKnobObject2(-100,100),
  233.                             Child, NewKnobObject2(-100,100),
  234.                             Child, Label('Treble:'),
  235.                             Child, HSpace(4),
  236.                             Child, NewKnobObject2(-100,100),
  237.                             Child, NewKnobObject2(-100,100),
  238.                             Child, NewKnobObject2(-100,100),
  239.                             Child, NewKnobObject2(-100,100),
  240.                         End,
  241.                         Child, VSpace(0),
  242.                     End,
  243.                     
  244.                     Child, VGroup,
  245.                         Child, VGroup, GroupFrameT('Levelmeter Displays'),
  246.                             Child, VSpace(0),
  247.                             Child, HGroup,
  248.                                 Child, HSpace(0),
  249.                                 Child, NewObject(mousepowerclass.Class,0,
  250.                                             MUIA_Mousepower_Direction,1,
  251.                                             MUIA_Levelmeter_Label,'Horizontal',
  252.                                             TAG_DONE),
  253.                                 Child, HSpace(0),
  254.                                 Child, NewObject(mousepowerclass.Class,0,
  255.                                             MUIA_Mousepower_Direction,2,
  256.                                             MUIA_Levelmeter_Label,'Vertical',
  257.                                             TAG_DONE),
  258.                                 Child, HSpace(0),
  259.                                 Child, NewObject(mousepowerclass.Class,0,
  260.                                             MUIA_Mousepower_Direction,0,
  261.                                             MUIA_Levelmeter_Label,'Total',
  262.                                             TAG_DONE),
  263.                                 Child, HSpace(0),
  264.                             End,
  265.                             Child, VSpace(0),
  266.                         End,
  267.                         Child, VGroup, GroupFrameT('Numeric Buttons'),
  268.                             Child, VSpace(0),
  269.                             Child, HGroup, GroupSpacing(0),
  270.                                 Child, HSpace(0),
  271.                                 Child, ColGroup(4), MUIA_Group_VertSpacing, 1,
  272.                                     Child, VSpace(0),
  273.                                     Child, CLabel('Left'),
  274.                                     Child, CLabel('Right'),
  275.                                     Child, CLabel('SPL'),
  276.                                     Child, Label1('Low:'),
  277.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,0,100,'%3ld %%']),
  278.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,0,100,'%3ld %%']),
  279.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,30,99,'%2ld dB']),
  280.                                     Child, Label1('Mid:'),
  281.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,0,100,'%3ld %%']),
  282.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,0,100,'%3ld %%']),
  283.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,30,99,'%2ld dB']),
  284.                                     Child, Label1('High:'),
  285.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,0,100,'%3ld %%']),
  286.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,0,100,'%3ld %%']),
  287.                                     Child, MUI_MakeObjectA(MUIO_NumericButton,[NIL,30,99,'%2ld dB']),
  288.                                 End,
  289.                                 Child, HSpace(0),
  290.                             End,
  291.                             Child, VSpace(0),
  292.                         End,
  293.                     End,
  294.                 End,
  295.  
  296.                 Child, VSpace(4),
  297.  
  298.                 Child, ColGroup(2),
  299.                     Child, Label('Slidorama Rating:'),
  300.                     Child, NewObject(ratingclass.Class,0,MUIA_Numeric_Value,50,TAG_DONE),
  301.                 End,
  302.             End,
  303.         End,
  304.     End
  305.  
  306.     IF app=NIL THEN Raise('Failed to create Application')
  307.  
  308.     DoMethod(window,MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
  309.         app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit)
  310.  
  311.  
  312. /*
  313. ** This is the ideal input loop for an object oriented MUI application.
  314. ** Everything is encapsulated in classes, no return ids need to be used,
  315. ** we just check if the program shall terminate.
  316. ** Note that MUIM_Application_NewInput expects sigs to contain the result
  317. ** from Wait() (or 0). This makes the input loop significantly faster.
  318. */
  319.  
  320.     set(window,MUIA_Window_Open,MUI_TRUE)
  321.  
  322.     WHILEN DoMethodA(app,[MUIM_Application_NewInput,&sigs])=MUIV_Application_ReturnID_Quit
  323.         IF sigs THEN sigs := Wait(sigs)
  324.     ENDWHILE
  325.  
  326.     set(window,MUIA_Window_Open,FALSE)
  327.  
  328. /*
  329. ** Shut down...
  330. */
  331.  
  332. EXCEPTDO
  333.     IF app THEN MUI_DisposeObject(app)                /* dispose ALL objects. */
  334.     CleanupClasses()
  335.     IF UtilityBase THEN CloseLibrary(UtilityBase)     /* close library */
  336.     IF MUIMasterBase THEN CloseLibrary(MUIMasterBase) /* close library */
  337.     IF exception THEN PrintF('\s\n',exception)
  338. ENDPROC
  339.  
  340. PROC NewKnobObject1(max,defi)(PTR) IS
  341.     KnobObject,
  342.         MUIA_Numeric_Max,max,
  343.         MUIA_Numeric_Default,defi,
  344.         MUIA_CycleChain,1,
  345.     End
  346.  
  347. PROC NewKnobObject2(min,max)(PTR) IS
  348.     KnobObject,
  349.         MUIA_Numeric_Max,max,
  350.         MUIA_Numeric_Min,min,
  351.         MUIA_CycleChain,1,
  352.     End
  353.  
  354.